AppleEvents 101 Bug
Volume Number: 9
Issue Number: 7
Column Tag: Article Rebuttal
Apple Events 101 Bug 
Bit Mask vs. Bit Number
By John Theisen, Flagstaff, Arizona
About the author
John Theisen, Macintosh Developer
1000 W. Forest Meadows #262, Flagstaff, AZ 86001 USA INTERNET:
jjt@naucse.cse.nau.edu
Dear Sirs,
This letter is in response to the writer of AppleEvents 101 in your May 1993
Issue of MacTech Magazine.
While debugging the code that I had entered I came across a few problems with Dr.
Kane's InitMac() routine. His painstaking use of the Gestalt Manager to determine the
environment that the application is functioning in was done without a flaw, UNTIL he
tests for the PPC attributes.
Dr Kane's code reads as follows:
if (BitTest(&response, gestaltPPCSupportsRealTime) != 0)
theErr = PPCInit();
// if this bit is not set, we need to initialize
OK this looks to be correct given the previous calls to Gestalt() and then the
testing of the attributes. Apple Inside Macintosh, Volume VI, Using the PPC Toolbox
(page 7-10) specifical states that testing for the gestaltPPCSupportsRealTime should
be conducted in the following manner:
{1}
err := Gestalt(gestaltPPCToolboxAttr, PPCAttributes);
IF err = noErr
THEN {PPC Toolbox is present}
BEGIN
IF BAND(PPCAttributes, gestaltPPCSupportsRealTime)=0
THEN
BEGIN
{INIT PPC Toolbox HERE}
END
END
This shows that in order to test for the gestaltPPCSupportsRealTime we are using
a Binary AND ... this is *NOT* the same as a BitTest operation.
I have substituted the following code which matches more closely with Apple's
version:
/* 2 */
if ((response & gestaltPPCSupportsRealTime) == 0)
theErr = PPCInit();
// if this bit is not set, we need to initialize
if ((response & gestaltPPCSupportsOutGoing) == 0);
// tell the user to turn on AppleTalk
if ((response & gestaltPPCSupportsIncoming) == 0);
// tell the user to activate file sharing or Appletalk
For clarification of the BTST operation in the BitTest() procedure provided by
Dr. Kane I am quoting the Motorola M68000 Programmer's Reference Manual
"BTST Test a Bit
A bit in the destination operand is tested, and the state of the specified bit is
reflected in the Z condition code. If a data register is the destination, then the bit
number is modulo 32, allowing bit manipulation on all bits in a data register...
The PPC constants are defined as:
/* 3 */
gestaltPPCToolboxPresent = 0x0000
/* PPC Toolbox is present. Requires PPCInit to be called */
gestaltPPCSupportsRealTime = 0x1000
/* PPC Supports real-time delivery */
gestaltPPCSupportsIncoming = 0x0001
/* PPC will deny incoming network requests */
gestaltPPCSupportsOutGoing = 0x0002
/* PPC will deny outgoing network requests */
[taken from GestaltEqu.h Copyright Apple Computer, Inc. 1988-1990]
In the code originally supplied, we would be testing BIT 4096 (and since 4096
MOD 32 = 0, the code would test BIT 0). This happens to be the bit indicating that the
PPC Toolbox is present.
The cases for gestaltPPCSupportsIncoming and gestaltPPCSupportsOutGoing read
much the same as the above case for gestaltPPCSupportsRealTime. If used with the
BitTest() operation gestaltPPCSupportsIncoming will test BIT 1 instead of BIT 0
(0x0001 in binary has BIT 0 set not BIT 1) and gestaltPPCSupportsOutGoing is also
off by 1, testing BIT 2 instead of BIT 1.
When testing for these PPC toolbox attributes, Apple requires that you use these
as bit masks and NOT bit numbers. Although your code may check out fine in the
testing phase, these lurking bugs will come back to haunt you.
I hope that some other Developers can find this information useful. As a side
note, users who wish to notify the user of the AE101 application that they need to turn
on Appletalk in the Chooser should notice that the initialization of the Dialog Manager
as well as a few other key managers should take place before they try to place any
dialogs on the screen.
John Theisen
Macintosh Developer
NOTE Published in Editorial, August 1993:
Oops!
Jeff Kane wrote one of our most successful articles - AppleEvents 101 in the
May ‘93 issue. We printed a rebuttal to his article that turned out not to be his bug.
Evidently, Apple changed the header files and as a result, the definition of the
gestaltPPC constants. Sorry Jeff.